/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.rencanaanggaranpendapatanuanguksksasuransi;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.sadhar.sia.common.ClassConnection;

/**
 *
 * @author kris
 */
public class RencanaAnggaranPendapatanUangUktSksAsuransiDAOImpl implements RencanaAnggaranPendapatanUangUktSksAsuransiDAO {

    public RencanaAnggaranPendapatanUangUktSksAsuransiDAOImpl() {
        ClassConnection.getTransactionProxyFactoryBean().setTarget(this);
    }

    /**
     * Digunakan untuk mendapatkan data pos pendapatan dengan idPosPendatan 1,2 dan 4 dari
     * tabel ppmk.posPendapatan
     * @return
     * @throws Exception
     */
    public List<Map> getPosPendapatan() throws Exception {
        String sql = "select * from ppmk.posPendapatan WHERE idPosPendapatan=1 or "
                + " idPosPendapatan=2 or idPosPendapatan=4 order by posPendapatan";
        List<Map> maps = ClassConnection.getJdbc().queryForList(sql);
        return maps;
    }

    /**
     * Digunakan untuk mendapatkan nama unit kerja dari table ppmk.posAnggaranPendapatanUnit,kamus.unkerja
     * berdasarkan tahunAnggaran dan idPosPendapatan
     * @param tahun
     * @param idPosPendapatan
     * @return
     * @throws Exception
     */
    public List<Map> getUnitKerja(String tahun, int idPosPendapatan) throws Exception {
        String sql = "select un.Kd_unit_kerja,ap.idPosAnggaranPendapatanUnit as idPosPendapatanUnit,un.Nama_unit_kerja,SUBSTRING(un.Kd_unit_kerja,4,4) AS kodeProdi  from ppmk.posAnggaranPendapatanUnit as ap "
                + " inner join kamus.unkerja as un on ap.kodeUnitKerja=un.Kd_unit_kerja "
                + " where idPosPendapatan=? "
                + " AND tahunAnggaran=? ";
        List<Map> maps = ClassConnection.getJdbc().queryForList(sql, new Object[]{idPosPendapatan, tahun});
        return maps;
    }

    /**
     * Digunakan untuk mendapatkan data anggaran pendapatan unit ukt asuransi dari tabel
     * ppmk.anggaranPendapatanUnitUKTSKS,ppmk.posAnggaranPendapatanUnit,kamus.unkerja
     * berdasarkan tahunAnggaran dan idPosAnggaranPendapatanUnit
     * @param tahun
     * @param idPosPendapatan
     * @return
     * @throws Exception
     */
    public List<Map> getAnggaranPendapatanUnitUKTAsuransi(String tahun, int idPosPendapatan) throws Exception {
        String sql = "SELECT * FROM ppmk.anggaranPendapatanUnitUKTSKS apuus "
                + " INNER JOIN ppmk.posAnggaranPendapatanUnit papu ON (papu.idPosAnggaranPendapatanUnit=apuus.idPosAnggaranPendapatanUnit)"
                + " INNER JOIN kamus.unkerja uk ON(uk.Kd_unit_kerja=papu.kodeUnitKerja) "
                + " WHERE apuus.idPosAnggaranPendapatanUnit=? order by Nama_unit_kerja,periode,thnAngkatan";

        List<Map> map = ClassConnection.getJdbc().queryForList(sql, new Object[]{idPosPendapatan});
        return map;
    }

    /**
     * Digunakan untuk mendapatkan data ukt dan asuransi dari prodi tertentu
     * berdasarkan kodeProdi dan tahunAnggaran
     * @param kodeProdi
     * @param tahunAnggaran
     * @return
     */
    public List<Map> getDetailProdiUKTAsuransi(String kodeProdi, String tahunAnggaran) {
        //String sql1 = "select  DISTINCT SUBSTRING(nomor_mhs,1,2) AS tahunAngkatan from db_" + kodeProdi + ".rg" + kodeProdi + tahunAnggaran + "1";
        String sql = "select  DISTINCT  if(substr(nomor_mhs,1,1)='9', concat('19', substr(nomor_mhs, 1,2)),concat('20', substr(nomor_mhs, 1,2))) AS tahunAngkatan"
                + " from db_" + kodeProdi + ".rg" + kodeProdi + tahunAnggaran + "1 order by tahunAngkatan desc";
        return ClassConnection.getJdbc().queryForList(sql);
    }

    /**
     * Digunakan untuk mendapatkan data sks dari prodi tertentu berdasarkan
     * kode prodi dan tahunAnggaran
     * @param kodeProdi
     * @param tahunAnggaran
     * @return
     * @throws Exception
     */
    @Override
    public List<Map> getDetailProdiSKS(String kodeProdi, String tahunAnggaran) throws Exception {
        //String sql = "select  DISTINCT SUBSTRING(nomor_mhs,1,2) AS tahunAngkatan from db_" + kodeProdi + ".rg" + kodeProdi + tahunAnggaran + "1";
        String sql = "select  DISTINCT  if(substr(nomor_mhs,1,1)='9', concat('19', substr(nomor_mhs, 1,2)),concat('20', substr(nomor_mhs, 1,2))) AS tahunAngkatan"
                + " from db_" + kodeProdi + ".rg" + kodeProdi + tahunAnggaran + "1 order by tahunAngkatan desc";
        return ClassConnection.getJdbc().queryForList(sql);
    }

    /**
     * Digunakan untuk mendapatkan jumlah data mahasiswa berdasarkan kodeProdi,
     * tahunAnggaran,tahunAngkatan
     * @param kodeProdi
     * @param tahunAnggaran
     * @param tahunAngkatan
     * @return
     * @throws Exception
     */
    public int getJumlahMahasiswa(String kodeProdi, String tahunAnggaran, String tahunAngkatan) throws Exception {
        String sql = "SELECT COUNT(*) as hasil FROM db_" + kodeProdi + ".rg" + kodeProdi + tahunAnggaran + "1"
                + " WHERE st_mhs='1' AND nomor_mhs LIKE '" + tahunAngkatan + "%'";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql);
        int hasil = 0;
        for (Map map : result) {
            hasil = Integer.parseInt(map.get("hasil").toString());
        }
        return hasil;

    }

    /**
     * Digunakan untuk mendapatkan tarif berdasarkan idPosPendapatan,tahunAnggaran,tahunAngkatan
     * dan kodeProdi
     * @param idPosPendapatan
     * @param tahunAnggaran
     * @param tahunAngkatan
     * @param kodeProdi
     * @return
     * @throws Exception
     */
    public float getTarif(int idPosPendapatan, String tahunAnggaran, String tahunAngkatan, String kodeProdi) throws Exception {
        String sql = null;
        if (idPosPendapatan == 1) {
            sql = "SELECT besar_tagih FROM keuangan.tarif" + tahunAnggaran + " WHERE angkatan=" + tahunAngkatan
                    + " AND kd_tagih='0100' AND kd_prg=" + kodeProdi + "";
        }
        if (idPosPendapatan == 2) {
            sql = "SELECT besar_tagih FROM keuangan.tarif" + tahunAnggaran + " WHERE angkatan=" + tahunAngkatan
                    + " AND kd_tagih='0500' AND kd_prg=" + kodeProdi + "";
        }
        if (idPosPendapatan == 4) {
            sql = "SELECT besar_tagih FROM keuangan.tarif" + tahunAnggaran + " WHERE angkatan=" + tahunAngkatan
                    + " AND kd_tagih='0200' AND kd_prg=" + kodeProdi + "";
        }

        List<Map> result = ClassConnection.getJdbc().queryForList(sql);
        float hasil = 0f;
        for (Map map : result) {
            hasil = Float.parseFloat(map.get("besar_tagih").toString());
        }
        return hasil;
    }

    /**
     * Digunakan untuk mendapatkan data sks berdasarkan tahunAnggaran,tahunAngkatan dan kodeProdi
     * @param tahunAnggaran
     * @param tahunAngkatan
     * @param kodeProdi
     * @return
     * @throws Exception
     */
    public int getJumlahSKS(String tahunAnggaran, String tahunAngkatan, String kodeProdi) throws Exception {
        String sql = "SELECT SUM(SKS) as hasil FROM db_" + kodeProdi + ".kr" + kodeProdi + tahunAnggaran + "1"
                + " AS kr INNER JOIN db_" + kodeProdi + ".mtk" + kodeProdi + " AS "
                + " mtk ON kr.kd_mtk=mtk.kd_mtk WHERE nomor_mhs LIKE '" + tahunAngkatan + "%'";

        List<Map> result = ClassConnection.getJdbc().queryForList(sql);
        int hasil = 0;
        for (Map map : result) {
            try {
                hasil = Integer.parseInt(map.get("hasil").toString());
            } catch (NullPointerException e) {
                hasil = 0;
            }
        }
        return hasil;
    }

    /**
     * Digunakan untuk menyimpan rencana anggaran pendapatan uang ukt,sks dan asuransi kedalam
     * tabel ppmk.anggaranPendapatanUnitUKTSKS
     * @param uktSksAsuransi
     * @throws Exception
     */
    @Override
    public void insert(RencanaAnggaranPendapatanUangUktSksAsuransi uktSksAsuransi) throws Exception {
        String sql = "insert into ppmk.anggaranPendapatanUnitUKTSKS(idPosAnggaranPendapatanUnit,"
                + "periode,thnAngkatan,isAngkatanBaru,jmlMhsDU,tarif,jmlSKS,prosentase) "
                + " values(?,?,?,?,?,?,?,?)";
        ClassConnection.getJdbc().update(sql, new Object[]{
                    uktSksAsuransi.getIdPosPendapatanUnit(),
                    uktSksAsuransi.getPeriode(),
                    uktSksAsuransi.getTahunAngkatan(),
                    uktSksAsuransi.getIsAngkatanBaru(),
                    uktSksAsuransi.getJmlMhsDU(),
                    uktSksAsuransi.getTarif(),
                    uktSksAsuransi.getJmlSKS(),
                    uktSksAsuransi.getProsentase()
                });
    }

    /**
     * Digunakan untuk melakukan perubahan data pada tabel ppmk.anggaranPendapatanUnitUKTSKS
     * @param uktSksAsuransi
     * @throws Exception
     */
    @Override
    public void update(RencanaAnggaranPendapatanUangUktSksAsuransi uktSksAsuransi) throws Exception {
        String sql = "update ppmk.anggaranPendapatanUnitUKTSKS set jmlMhsDU=" + uktSksAsuransi.getJmlMhsDU() + ",tarif=" + uktSksAsuransi.getTarif() + ","
                + " jmlSKS=" + uktSksAsuransi.getJmlSKS() + ",prosentase=" + uktSksAsuransi.getProsentase() + ""
                + " where idPosAnggaranPendapatanUnit=" + uktSksAsuransi.getIdPosPendapatanUnit() + " "
                + " AND periode='" + uktSksAsuransi.getPeriode() + "' AND thnAngkatan=" + uktSksAsuransi.getTahunAngkatan() + "";
        System.out.println(sql);
        ClassConnection.getJdbc().update(sql);
    }

    /**
     * Digunakan untuk melakukan pengecekan data pada tabel ppmk.anggaranPendapatanUnitUKTSKS berdasarkan
     * idPostAnggaranPendapatanUnit,periode dan thnAngkatan
     * @param idPosAnggaranUnit
     * @param periode
     * @param tahunAngkatan
     * @return
     * @throws Exception
     */
    @Override
    public Boolean cekData(int idPosAnggaranUnit, String periode, String tahunAngkatan) throws Exception {
        String sql = "select *from ppmk.anggaranPendapatanUnitUKTSKS where "
                + " idPosAnggaranPendapatanUnit=? AND periode=? AND thnAngkatan=?";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{idPosAnggaranUnit, periode, tahunAngkatan});
        Map hasil = new HashMap();
        for (Map map : result) {
            hasil = map;
        }
        if (hasil.size() > 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Digunakan untuk mendapatkan prosentase dari tabel ppmk.anggaranPendapatanUnitUKTSKS
     * berdasarkan idPosAnggaranUnit, periode, tahunAngkatan
     * @param idPosAnggaranUnit
     * @param periode
     * @param tahunAngkatan
     * @return
     * @throws Exception
     */
    @Override
    public RencanaAnggaranPendapatanUangUktSksAsuransi getProsentase(int idPosAnggaranUnit, String periode, String tahunAngkatan) throws Exception {
        String sql = "SELECT apu.prosentase,apu.tarif,apu.jmlMhsDU,apu.jmlSKS FROM ppmk.anggaranPendapatanUnitUKTSKS apu "
                + " WHERE apu.idPosAnggaranPendapatanUnit=? AND "
                + " apu.thnAngkatan=? AND apu.periode=?";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{idPosAnggaranUnit, tahunAngkatan, periode});
        RencanaAnggaranPendapatanUangUktSksAsuransi uktSksAsuransi = null;
        for (Map map : result) {
            uktSksAsuransi = new RencanaAnggaranPendapatanUangUktSksAsuransi();
            uktSksAsuransi.setProsentase(Float.valueOf(map.get("prosentase").toString()));
            uktSksAsuransi.setTarif(Float.valueOf(map.get("tarif").toString()));
            uktSksAsuransi.setJmlMhsDU(Integer.valueOf(map.get("jmlMhsDU").toString()));
            uktSksAsuransi.setJmlSKS(Integer.valueOf(map.get("jmlSKS").toString()));
        }

        return uktSksAsuransi;

    }
}
